/*
 * cliente.cpp
 *
 *  Created on: 04/10/2011
 *      Author: guido
 */

#include "cliente.h"
#include "mensaje-login.h"
#include "mensaje-cambio-clave.h"
#include "constantes.h"
#include <iostream>

Cliente::Cliente(char* puerto, char* direccion) :
	socket(puerto, direccion) {

}

int Cliente::start(char* nombre, char* vieja, char* nueva) {
	int resultado = OK;
	if ( !validarNombreYClaves(nombre, vieja, nueva) ) {
		resultado = ERROR_PARAMETROS;
	}
	else {
		resultado = this->socket.conectar();
		if (resultado == OK) {
			resultado = this->logIn(nombre, vieja);
			if (resultado == OK) {
				resultado = this->cambiarClave(nueva);
			}
		}
	}
	return resultado;
}


int Cliente::logIn(std::string nombre, std::string clave) {
	MensajeLogin mensaje(nombre, clave);
	char* temp;
	int tamanyo;
	mensaje.serializar(temp, tamanyo);
	socket.enviar(temp, tamanyo);
	delete[] temp;
	char resultado;
	socket.recibir(&resultado, 1);
	return resultado;
}

int Cliente::cambiarClave(std::string nueva) {
	MensajeCambioClave mensaje(nueva);
	char* temp;
	int tamanyo;
	mensaje.serializar(temp, tamanyo);
	char identificador = 2;
	socket.enviar(&identificador, 1);
	socket.enviar(temp, tamanyo);
	delete[] temp;
	char resultado;
	socket.recibir(&resultado, 1);
	if (resultado != 0) {
		return 3;
	}
	else {
		return 0;
	}
}

bool Cliente::validarNombreYClaves(char* nombre, char* vieja, char* nueva) {
	bool valido = true;
	if ( !validar(nombre) || !validar(vieja) || !validar(nueva)	) {
		valido = false;
	}
	return valido;
}

bool Cliente::validar(char* cadena) {
	bool esValido = false;
	int tamanyo = strlen(cadena);
	if ( tamanyo >= 6) {
		if (strspn(cadena, CARACTERES_VALIDOS)
				== tamanyo ) {
			esValido = true;
		}
	}
	return esValido;
}

